/*
 * Copyright (c) 2009 DeledImporter
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'Pyro Games' nor the names of its contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package net.pyrogames.deled.geometry;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * Logical node to allow for the creation of a hierarchy based on
 * DeleD scene data and custom elements. For elements that have
 * children.
 * 
 * @author Nicholas Woodfield
 *
 */
public class DXSNode extends DXSSpatial {

	/** Children of the node */
	private ArrayList<DXSSpatial> children;
	
	/**
	 * Default constructor for <code>DXSNode</code>.
	 * 
	 * @param nodeName
	 * 		  Name of the node which is required.
	 */
	public DXSNode(String nodeName){
		super(nodeName);
		children = new ArrayList<DXSSpatial>(1);
	}
	
	/**
	 * Attach a <code>DXSSpatial</code> to this one. The
	 * newly attached node will automatically have its parent
	 * set to this one.
	 * 
	 * @param n
	 * 		 spatial to be attached.
	 */
	public void attachChild(DXSSpatial n){
		n.setParent(this);
		children.add(n);
	}
	
	/**
	 * Returns the child node at the specified index.
	 * 
	 * @param indx
	 * 		 Index where the child is located
	 * @return
	 * 		The child node
	 */
	public DXSSpatial getChild(int indx){
		return children.get(indx);
	}
	
	/**
	 * Gets the child node with the specified name. Returns
	 * the first node with the name, if multiple nodes
	 * with the same name are present.
	 * 
	 * @param name
	 * 		Name of the node
	 * @return
	 * 		The child node
	 */
	public DXSSpatial getChildNamed(String name){
		Iterator<DXSSpatial> it = children.iterator();
		while(it.hasNext()){
			DXSSpatial n = it.next();
			if(n.getName().equals(name)){
				return n;
			}
		}
		return null;
	}
	
	public ArrayList<DXSSpatial> getChildren(){
		return children;
	}
}
